
#ifndef BLOQUE_H_
#define BLOQUE_H_

#include <vector>
#include "Registro.h"

class Bloque {
private:
	int tDispersion;
	std::vector<Registro*> registros;
	short cantidadRegistros;
	short sizeBloque;
	short cantidadBytesLibres;

	/**
	 * Metodo que devuelve la posicion absoluta del registro dentro del bloque.
	 * Retorna -1 si no lo encontro
	 */
	int getPAR(Registro *registro);

	/**
	 * Setea la cantidad de bytes libres
	 */
	void setCantidadBytesLibres(short cantidad);

public:

	Bloque(int size);
	~Bloque();

	/**
	 * Agrega el registro  al bloque.
	 * Devuelve true si lo pudo agregar, de lo contrario false.
	 */
	bool agregarRegistro(Registro* registro);

	/**
	 * Elimina el registro del bloque.
	 * Devuelve si pudo eliminar el registro, de lo contrario false.
	 */
	bool eliminarRegistro(Registro* registro);

	/**
	 * Modifica el registro pasado por parametro.
	 * Se compactara o expandira el bloque según el caso.
	 */
	bool modificarRegistro(Registro* registro);

	/**
	 * Busca el registro pasado por parametro.
	 * Devuelve true si lo encontro, de lo contrario false.
	 * El registro encontrado es devuelto en el registro pasado por parametro.
	 */
	bool buscarRegistro(Registro* registro);

	/**
	 * Setea el tamaño del bloque(512 * 2^n)
	 */
	void setSize(int size);

	/**
	 * Retorna el tamaño del bloque.
	 */
	int getSize();

	/**
	 * Retorna el tamano de Dispersion
	 */
	int getTamanioDispersion();

	/**
	 * Retorna el tamano de Dispersion
	 */
	void setTamanioDispersion(int tamanioDispersion);

	/**
	 * Devuelve la cantidad de bytes libres que tiene el bloque.
	 */
	short getCantidadBytesLibres();

	/**
	 * Devuelve registro, lo elimina del bloque y aumenta una posicion dentro del
	 * bloque para retornar el proximo registro. Sino se puede desacolar devuelve NULL.
	 */
	Registro* desacolarRegistros();

	/**
	 * Devuelve la referencia al vector de registros.
	 */
	std::vector<Registro*>* getRegistros();

	/**
	 * Obtiene el bloque de acuerdo a la representacion del char* de serializar().
	 */
	char* serializar();

	/**
	 * Obtiene el bloque de acuerdo a la serializacion con char*
	 */
	void hidratar(char* bloque);

	/**
	 * Devuelve la cantidad de registros que contiene.
	 */
	int getCantidadRegistros();

	/**
	 * Pregunta si está vacio
	 */
	bool tieneRegistros();

	/**
	 * Compara el bloque y ve si es igual
	 */
	bool equals(Bloque* bloque);
};

#endif /* BLOQUE_H_ */
